#include <iostream>
#include <thread>
#include <chrono>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>

using std::cout;
using std::endl;

void test_1(sw::redis::Redis &redis)
{
    redis.flushall(); // 清空数据库内容

    // 使用通用命令
    redis.set("张三", "20");
    redis.set("李四", "21");
    redis.set("王五", "22");

    // get返回optional类型，可隐式类型转换为bool类型
    auto value1 = redis.get("张三");
    auto value2 = redis.get("李四");
    auto value3 = redis.get("王五");
    auto value4 = redis.get("赵六");

    // value()调用_M_get()
    if (value1)
        cout << value1.value() << endl;
    if (value2)
        cout << value2.value() << endl;
    if (value3)
        cout << value3.value() << endl;
    if (value4)
        cout << value4.value() << endl;
    // operator*也调用_M_get()
    //  cout<<*value1<<endl;
    //  cout<<*value2<<endl;
    //  cout<<*value3<<endl;
}

// exists、del的使用
void test_2(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("hello", "world");
    cout << "exists:" << redis.exists("hello") << endl;            // 返回1
    cout << "exists:" << redis.exists("happy") << endl;            // 返回0
    cout << "exists:" << redis.exists({"happy", "hello"}) << endl; // 返回1,重载初始化列表形式计算

    cout << "del" << redis.del({"hello", "happy"}) << endl;
    cout << "del-exists" << redis.exists({"hello", "happy"}) << endl;
}
// keys的使用
void test_3(sw::redis::Redis &redis)
{
    redis.flushall();

    redis.set("key1", "1");
    redis.set("key2", "2");

    std::vector<std::string> result;
    auto it = std::back_inserter(result);
    // template <typename Output>
    // void Redis::keys(const StringView &pattern, Output output) {
    //     auto reply = command(cmd::keys, pattern);
    //     reply::to_array(*reply, output);
    // }
    // 依赖于pattern和插入迭代器传参，c++back_inserter()返回插入迭代器。
    redis.keys("*", it);

    for (const auto &e : result)
    {
        cout << e << endl;
    }
}

void test_4(sw::redis::Redis &redis)
{
    redis.flushall();
    using namespace std::chrono_literals;//该命名空间支持了字面量s等时间

    redis.set("key", "1");
    // redis.expire("key", std::chrono::seconds(10));
    redis.expire("key", 10s);
    std::this_thread::sleep_for(1000ms);

    cout << redis.ttl("key") << endl;
}

void test_5(sw::redis::Redis& redis) {
    redis.flushall();

    redis.set("key", "111");
    std::string result = redis.type("key");
    std::cout << "key: " << result << std::endl;

    redis.lpush("key2", "111");
    result = redis.type("key2");
    std::cout << "key2: " << result << std::endl;

    redis.hset("key3", "aaa", "111");
    result = redis.type("key3");
    std::cout << "key3: " << result << std::endl;

    redis.sadd("key4", "aaa");
    result = redis.type("key4");
    std::cout << "key4: " << result << std::endl;

    redis.zadd("key5", "吕布", 99);
    result = redis.type("key5");
    std::cout << "key5: " << result << std::endl;
}

int main()
{
    sw::redis::Redis rd("tcp://127.0.0.1:6379");

    // test_1(rd);
    // test_2(rd);
    // test_3(rd);
    // test_4(rd);
    test_5(rd);
    return 0;
}
